from ClaseListaParaArbol import *
from ClaseArbolHuffman import *

class CompresorDescompresor:
    #PruebaCero Falla
    def comprimir(direccionEntrada,direccionSalida):
        global listaDeCaracteres
        listaDeCaracteres=ListaArbol.generarListaArbol(direccionEntrada)
        arbolHuff=ArbolHuffman("",0)
        try:
            arbolHuff=arbolHuff.generarArbolPartirLista(listaDeCaracteres)
        except:
            if(len(listaDeCaracteres)==1):
                print ("No mames, no te voi a comprimir una pinche letra")
            else:
                print("No hay nada wey!!!")

            return
        diccionarioBinario=arbolHuff.generarDiccionarioBinario(listaDeCaracteres,arbolHuff)
        lector=open(direccionEntrada,"r")
        escritor=open(direccionSalida,"w")
        cadenaTemporal=""
        listaTemporal=[]
        cadenaEscrituraTotal=""
        while True:
            caracter=lector.read(1)
            if not caracter:
                if(len(cadenaTemporal)>0):
                    cadenaEscritura=cadenaTemporal
                else:
                    cadenaEscritura=""
                break
            cadenaTemporal=cadenaTemporal+diccionarioBinario[caracter]
            if(len(cadenaTemporal)>=7):
                for i in cadenaTemporal:
                    listaTemporal.append(i)
                cadenaTemporal=""
                cadenaEscritura="0b"
                for i in listaTemporal:
                    if(len(cadenaEscritura)<9):
                        cadenaEscritura=cadenaEscritura+i
                    else:
                        cadenaTemporal=cadenaTemporal+i
                listaTemporal=[]
                cadenaEscrituraTotal=cadenaEscrituraTotal+chr(eval(cadenaEscritura))   
        if(len(cadenaEscritura)!=0):
            cadenaEscritura="[no]:"+cadenaEscritura
        cadenaEscrituraTotal=cadenaEscrituraTotal+cadenaEscritura
        arbolHuff.escribeArbolDer(escritor)
        escritor.write(cadenaEscrituraTotal)
        lector.close()
        escritor.close()

    def descomprimir(direccionEntrada,direccionSalida):
        lector=open(direccionEntrada,"r")
        escritor=open(direccionSalida,"w")
        arbolRegresado=ArbolHuffman("",0)
        alt=ArbolHuffman("",0)
        arbolRegresado=alt.generarArbolDesdeArchivo(lector,arbolRegresado)
        arbolRegresado.generarDiccionarioBinario(listaDeCaracteres,arbolRegresado)
        caracteresSobrantes=""
        sobra=""
        while True:
            listaCaracteres=[]
            caracteresCompresos=lector.read(512)
            if not caracteresCompresos:
                break
            if(caracteresCompresos.count("[no]:")==1):
                listaAlterna=caracteresCompresos.split("[no]:")
                caracteresCompresos=listaAlterna[0]
                caracteresSobrantes=listaAlterna[1]
            if(len(sobra)>0):
                caracteresCompresos=sobra+caracteresCompresos
            for i in caracteresCompresos:
                if(i.isnumeric()==True):
                    retenedor=bin(ord(i))
                    listaMin=retenedor.split("0b")
                    retenedor=listaMin[1]
                    while(len(retenedor)<7):
                        retenedor="0"+retenedor
                    for j in retenedor:
                        listaCaracteres.append(j)
                else:
                    listaCaracteres.append(i)
                    
            sobra=arbolRegresado.generarLetras(escritor,listaCaracteres)
        #if(len(caracteresSobrantes)>0):
        #sobra=sobra+caracteresSobrantes
        #arbolRegresado.generarLetras(escritor,listaCaracteres)
        
        
        
        lector.close()
        escritor.close()
